package com.xiaouyudeguang.common.utils;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;

/**
 * <p>
 * 对象操作工具
 * </p>
 *
 * @author 赵光
 * @since 2019年4月8日
 */
public final class ObjectUtils {

    /**
     * 获取当前对象的的全量类名
     *
     * @param o
     * @return
     */
    public static String className(Object o) {
        return o == null ? null : o.getClass().getName();
    }

    /**
     * 获取当前对象的的精简类名
     *
     * @param o
     * @return
     */
    public static String simpleClassName(Object o) {
        return o == null ? null : o.getClass().getSimpleName();
    }

    /**
     * 对象空判断
     */
    @SuppressWarnings("rawtypes")
    public static boolean isEmpty(Object o) {
        if (o == null) {
            return true;
        }
        if (o.getClass() == String.class) {
            return "".equals(o);
        }
        if (o.getClass().isArray()) {
            return Array.getLength(o) == 0;
        }
        if (o instanceof CharSequence) {
            return ((CharSequence) o).length() == 0;
        }
        if (o instanceof Collection) {
            return ((Collection) o).isEmpty();
        }
        if (o instanceof Map) {
            return ((Map) o).isEmpty();
        }
        return false;
    }

    /**
     * 判断参数对象是否不为空
     *
     * @param o
     * @return
     */
    public static boolean isNotEmpty(Object o) {
        return Boolean.FALSE == isEmpty(o);
    }

    /**
     * 判断对象数组是否包含空或空字符串
     *
     * @param oArray
     * @return
     */
    public static boolean anyEmpty(Object... oArray) {
        if (oArray == null || oArray.length == 0) {
            return true;
        }
        for (Object o : oArray) {
            if (isEmpty(o)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断对象数组是否都不为空或空字符串
     *
     * @param oArray
     * @return
     */
    public static boolean notEmpty(Object... oArray) {
        return Boolean.FALSE == anyEmpty(oArray);
    }

    /**
     * 是否全部相等
     *
     * @param source
     * @param targets
     * @return
     */
    public static boolean equals(Object source, Object... targets) {
        if (isEmpty(source) || targets == null || targets.length == 0) {
            return false;
        }
        for (Object target : targets) {
            if (!source.equals(target)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 是否和其中一个相等
     *
     * @param source
     * @param targets
     * @return
     */
    public static boolean in(Object source, Object... targets) {
        for (Object target : targets) {
            if (equals(source, target)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 是否全部不相等
     *
     * @param source
     * @param targets
     * @return
     */
    public static boolean nequals(Object source, Object... targets) {
        return !equals(source, targets);
    }

    /**
     * 是否和任意一个不相等
     *
     * @param source
     * @param targets
     * @return
     */
    public static boolean nin(Object source, Object... targets) {
        return !in(source, targets);
    }

    /**
     * 获取参数对象的hashcode
     *
     * @param o
     * @return
     */
    public static String hashCode(Object o) {
        return o == null ? null : String.valueOf(o.hashCode());
    }

    public static <T> T getOrDefault(T value, T defaultValue) {
        return value != null ? value : defaultValue;
    }
}
